package com.share.device.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.share.common.core.exception.ServiceException;
import com.share.device.service.IMapService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class MapServiceImpl implements IMapService {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${tencent.map.key}")
    private String key;

    @Override
    public JSONObject calculateLatLng(String keyword) {
        String url = "https://apis.map.qq.com/ws/geocoder/v1/?address={address}&key={key}";

        Map<String, String> map = new HashMap<>();
        map.put("address", keyword);
        map.put("key", key);

        JSONObject response = restTemplate.getForObject(url, JSONObject.class, map);
        if (response.getIntValue("status") != 0) {
            throw new ServiceException("地图解析异常");
        }

        //返回第一条最佳线路
        JSONObject result = response.getJSONObject("result");
        System.out.println(result.toJSONString());
        return result.getJSONObject("location");
    }


    /**
     * 根据经纬度计算距离
     * @param startLongitude 起点经度
     * @param startLatitude 起点纬度
     * @param endLongitude 终点经度
     * @param endLatitude 终点纬度
     * @return 返回两个地理坐标点之间的距离，单位为米
     * @throws ServiceException 如果地图服务调用失败，则抛出此异常
     */
    @Override
    public Double calculateDistance(String startLongitude,String startLatitude,String endLongitude,String endLatitude) {
        // 定义腾讯地图API的URL模板
        String url = "https://apis.map.qq.com/ws/direction/v1/walking/?from={from}&to={to}&key={key}";

        // 创建一个映射，用于存储请求参数
        Map<String, String> map = new HashMap<>();
        // 将起点的纬度和经度格式化后放入映射中
        map.put("from", startLatitude + "," + startLongitude);
        // 将终点的纬度和经度格式化后放入映射中
        map.put("to", endLatitude + "," + endLongitude);
        // 将API密钥放入映射中
        map.put("key", key);

        // 使用RestTemplate调用腾讯地图API，并将结果解析为JSONObject
        JSONObject result = restTemplate.getForObject(url, JSONObject.class, map);
        // 如果API调用状态不是0，则抛出异常
        if(result.getIntValue("status") != 0) {
            throw new ServiceException("地图服务调用失败");
        }

        // 返回第一条最佳线路
        JSONObject route = result.getJSONObject("result").getJSONArray("routes").getJSONObject(0);
        // 获取并返回线路的距离，单位为米
        return route.getBigDecimal("distance").doubleValue();
    }


}